自下而上 - CS50x 2023
学习目标
- 练习处理图像
- 了解元数据
- 进一步了解
struct的用途
背景
想象一下,你在一个重要的演示文稿中需要展示的图像,不知怎么的损坏了!经过调查,你发现图像主体完好,但查看时却发现图像上下颠倒了!
回想一下,数字图像文件只是一个比特序列,以某种方式排列。那么,一个24位的BMP文件,本质上就是一个比特序列,其中每24个比特(近似地)代表一个像素的颜色。但是 BMP 文件也包含一些“元数据”,例如图像的高度和宽度等信息。这些元数据以两种数据结构的形式,存储在文件开头,通常被称为“头部”,注意不要和C语言的头文件混淆。第一个头部,称为 BITMAPFILEHEADER,长度为 14 字节。(回想一下,1 字节等于 8 比特。)第二个头部,称为 BITMAPINFOHEADER,长度为 40 字节。紧随这些头部之后的是实际的位图:一个字节数组,其中每三个字节代表一个像素的颜色。
你的任务是通过编程修改元数据,使位图的顶行显示在最上方,底行显示在最下方。最好避免直接修改像素,以防进一步损坏文件!
提示
- 请务必仔细查看
bmp.h文件中BITMAPINFOHEADER结构体的成员。 - 阅读每个成员的文档,确定你需要修改哪些成员,以及如何修改它们。
- 请务必仔细查看
开始
- 使用你的 GitHub 帐户登录 cs50.dev。
- 单击终端窗口内部并执行
cd。 - 执行
wget https://cdn.cs50.net/2022/fall/labs/4/bottomup.zip后按回车键,即可在你的 codespace 中下载名为bottomup.zip的压缩文件。 - 请注意
wget命令和URL之间的空格,以及其他任何字符的正确性! - 现在执行
unzip bottomup.zip以创建一个名为bottomup的文件夹。 - 删除压缩包:执行
rm bottomup.zip,并在提示符下输入“y”后按回车键确认。
演示
实现细节
请查阅 bmp.h 文件注释中提到的 BITMAPFILEHEADER 和 BITMAPINFOHEADER 的相关文档链接。仔细查看 BITMAPINFOHEADER struct 的成员。使用该信息在 bottomup.c 中编写一些代码,将图像从自下而上更改为自上而下。相关代码并不复杂,特别是当你理解了原理之后!
思考题
- 为什么图像文件需要元数据?
如何测试你的代码
你的程序应该按照下面的示例运行。
bottomup/ $ ./bottomup harvard_bottomup.bmp harvard_topdown.bmp
当你的程序正常工作时,你应该在你的 bottomup 目录中看到一个新文件 harvard_topdown.bmp。打开它,看看图像的方向是否正确。
你可以使用 check50 命令检查你的代码。在 $ 提示符下输入以下内容即可使用 check50,这是 CS50 用于测试你代码的程序。但一定要自己测试一下!
check50 cs50/labs/2023/x/bottomup
要检查你的代码风格(缩进和空格)是否符合规范,请在 $ 提示符下输入以下命令。
如何提交
无需提交!这是一个练习题。